/**
 * 开发团队 : 未来科技
 * 开发人员 : ww
 * 开发时间 : 2020/5/16 11:36 AM
 * 文件名称 : auth.js
 * 开发工具 : WebStorm
 * 功能描述 : .
 */

const sha1 = require('sha1')
const config = require('../config/index')
const { getUserDataAsync, parseXmlAsync, formatMessage } = require('../utils/tool')
const template = require('./template')
const reply = require('./reply')

module.exports = () => {

    return async (req, res, next) => {
        // 获取 微信服务器参数
        const { signature, echostr, timestamp, nonce } = req.query
        const { token } = config

        const sha1Str = sha1([timestamp, nonce, token].sort().join(''))

        if (req.method == 'GET') {
            // 加密生成一个 signature，和微信发送过来的signature 进行对比
            if (sha1Str === signature) {
                // 消息来自于微信服务器，发送echostr给微信服务器
                res.send(echostr)
            } else {
                res.send("error")
            }

        } else if (req.method == 'POST') {
            // 微信服务器将用户请求的数据以POST请求的方式转发到开发者服务器上
            if (sha1Str !== signature) {
                res.send("error")
            }

            // 接收请求体中的数据，流式数据
            const xmlData = await getUserDataAsync(req)

            // 将xml数据解析为 js 对象
            const jsData = await parseXmlAsync(xmlData)

            // 格式化js对象数据
            const message = formatMessage(jsData)

            options = reply(message)
            // 回复用户消息
            const replyMessage = template(options)

            // 返回响应给微信服务器
            res.send(replyMessage)

            // 如果开发者服务器没有响应微信服务器，微信服务器会发送三次请求
            // res.send('')

        } else {
            // 其他方式请求
            res.send("error")
        }

    }
}